package com.cmcc.groupcontacts.base;

import java.io.Serializable;

import com.cmcc.groupcontacts.common.Const;

import android.content.ContentValues;


/**
 * SQLite数据库模型基类
 * 
 * @author 
 * 
 */
public abstract class BaseModel implements Serializable {
	private static final long serialVersionUID = 3029684431118321641L;

	public static final String NULL = Const.PACKAGE_NAME + ".null";

	protected transient ContentValues contentValues;

	// 是否将空值放入ContentValues中，通常是新增数据时设置为false，修改数据时设置为true
	private boolean putNullValue = true;
	
	public int id;

	public BaseModel() {
	}

	/**
	 * 获取或生成ContentValues对象（默认包含空值）
	 * 
	 * @return
	 */
	public ContentValues getContentValues() {
		if (contentValues == null) {
			return parse2ContentValues();
		} else {
			return contentValues;
		}
	}

	/**
	 * 获取或生成不包含空值的ContentValues对象
	 * 
	 * @return
	 */
	public ContentValues getNotNullContentValues() {
		if (contentValues == null) {
			putNullValue = false;
			return parse2ContentValues();
		} else {
			// TODO: 当contentValues存在时，是否需要遍历移除空值项
			return contentValues;
		}
	}

	/**
	 * 将实体bean转换为ContentValues对象的抽象方法
	 * 
	 * @return
	 */
	public abstract ContentValues parse2ContentValues();

	/**
	 * 填充ContentValues对象
	 * 
	 * @param key
	 * @param value
	 */
	public void putValue(String key, Object value) {
		if (this.contentValues == null)
			contentValues = new ContentValues();
		if (value == null) {
			if (putNullValue) {
				contentValues.putNull(key);
			}
			return;
		}
		// 自定义空值需处理
		if (value.equals(NULL)) {
			contentValues.putNull(key);
			return;
		}

		if (value instanceof Boolean) {
			contentValues.put(key, (Boolean) value);
			return;
		} else if (value instanceof Byte) {
			contentValues.put(key, (Byte) value);
			return;
		} else if (value instanceof byte[]) {
			contentValues.put(key, (byte[]) value);
			return;
		} else if (value instanceof Double) {
			contentValues.put(key, (Double) value);
			return;
		} else if (value instanceof Float) {
			contentValues.put(key, (Float) value);
			return;
		} else if (value instanceof Integer) {
			contentValues.put(key, (Integer) value);
			return;
		} else if (value instanceof Long) {
			contentValues.put(key, (Long) value);
			return;
		} else if (value instanceof Short) {
			contentValues.put(key, (Short) value);
			return;
		} else if (value instanceof String) {
			contentValues.put(key, (String) value);
			return;
		} else if (value instanceof ContentValues) {
			contentValues.putAll((ContentValues) value);
			return;
		}
	}
}
